package com.uacp.sgb.negocio.servicios;

import java.util.ArrayList;
import java.util.List;

import com.uacp.sgb.datos.dominio.entidades.BajaBienes;
import com.uacp.sgb.datos.dominio.entidades.Bien;
import com.uacp.sgb.datos.dominio.entidades.Equipo;
import com.uacp.sgb.datos.dominio.entidades.EquipoBaja;
import com.uacp.sgb.datos.dominio.entidades.Expediente;
import com.uacp.sgb.datos.dominio.entidades.Mueble;
import com.uacp.sgb.datos.dominio.entidades.MuebleBaja;
import com.uacp.sgb.datos.dominio.entidades.Oficio;
import com.uacp.sgb.datos.dominio.persistencia.dao.BajaBienesDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.BienDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.ExpedienteDao;
import com.uacp.sgb.datos.dominio.persistencia.dao.OficioDao;

public class ServicioBaja 
{
	private List<Bien> bienesNormales;
	private List<Bien> bienesBaja;
	
	public ServicioBaja(List<Bien> bienes, List<Bien> bajas)
	{
		bienesNormales = bienes;
		bienesBaja = bajas;
	}
	
	public void marcarBienes(List<Bien> bienes)
	{
		boolean encontrado;
		
		for(Bien bien: bienes)
		{
			encontrado = bienesNormales.remove(bien);
			
			if(!encontrado)
				throw new RuntimeException();
			
			bienesBaja.add(bien);
		}
	}
	
	public void desmarcarBienes(List<Bien> bajas) 
	{
		boolean encontrado;
		
		for(Bien bien: bajas)
		{
			encontrado = bienesBaja.remove(bien);
			
			if(!encontrado)
				throw new RuntimeException();
			
			bienesNormales.add(bien);
		}
	}
	
	public void darDeBaja( Expediente expediente, Oficio oficio)
	{
		List<EquipoBaja> equiposBaja = new ArrayList<>();
		List<MuebleBaja> mueblesBaja = new ArrayList<>();
		
		separarBienes(equiposBaja, mueblesBaja);
		
		actualizarEstadoBienes();
		
		BajaBienes bajaBienes = new BajaBienes();
		
		bajaBienes.setOficio(oficio);
		bajaBienes.setExpediente(expediente);
		bajaBienes.setEquiposBaja(equiposBaja);
		bajaBienes.setMueblesBaja(mueblesBaja);
		
		bajaBienes.setEstado("pendiente");
		BajaBienesDao.guardar(bajaBienes);
	}
	
	private void separarBienes(List<EquipoBaja> equiposBaja, List<MuebleBaja> mueblesBaja)
	{		
		for(Bien bien: bienesBaja)
		{
			if(bien instanceof Equipo)
			{
				EquipoBaja equipoBaja = new EquipoBaja();
				equipoBaja.setEquipo((Equipo)bien);
				
				equiposBaja.add(equipoBaja);
			}
			
			if(bien instanceof Mueble)
			{
				MuebleBaja muebleBaja = new MuebleBaja();
				muebleBaja.setMueble((Mueble)bien);
				
				mueblesBaja.add(muebleBaja);
			}
			
		}
	}
	
	private void actualizarEstadoBienes()
	{
		for(Bien bien: bienesBaja)
		{
			bien.setCondicion("pendiente");
			BienDao.updateBien(bien);
		}
	}
}
